local protobuf_helper = require "protobuf_helper"


local M = {}
local CMD_LEN = 2


function M.parse_cmd(cmd_origin_data)
    local origin_data_len = string.len(cmd_origin_data)
    local format = string.format("> i2 c%d", origin_data_len - CMD_LEN)
    local cmd, origin_data = string.unpack(format, cmd_origin_data)
    cmd = tonumber(cmd)
    return cmd, origin_data
end

function M.parse_origin_data(type, origin_data)
    local msg = protobuf_helper.decode(type, origin_data)
    return msg
end

function M.parse_client_data(cmd_origin_data)
    local cmd = -1
    local msg = {}
    local cmd, origin_data = M.parse_cmd(cmd_origin_data)
    if cmd < 0 then
        return cmd, msg
    end

    local proto_type = protobuf_helper.get_client_protobuf_type(cmd)
    if proto_type then
        print("proto_type:" .. proto_type .. " origin_data_len:" .. string.len(origin_data))
        msg = protobuf_helper.decode(proto_type, origin_data)
        if not msg then
            print("proto decode error, cmd:" .. cmd .. " proto_type:" .. proto_type)
        end
    end

    return cmd, msg
end

function M.encode_server_proto_data(cmd, msg)
    local proto_type = protobuf_helper.get_server_protobuf_type(cmd)
    if not proto_type then
        return
    end

    print("proto_type:" .. proto_type)

    return protobuf_helper.encode(proto_type, msg)
end

function M.pack_server_data(cmd, msg)
    local proto_pack = M.encode_server_proto_data(cmd, msg)
    local proto_len = string.len(proto_pack)
    local format = string.format(">i2 >i2 c%d", proto_len)
    local pack = string.pack(format, proto_len + CMD_LEN, cmd, proto_pack)
    return pack
end


return M